package com.wlz.authorization.config;

import com.wlz.authorization.handler.MyAccessDeniedHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 *  Authorization 授权
 *    访问控制的url匹配
 *      在配置类中http.authorizeRequests() 主要是对url进行控制。配置顺序会影响之后授权的效果，越是具
 *      体的应该放在前面，越是笼统的应该放到后面。
 * 1. ant 表达式
 *      通配符	        说明
 *        ?	        匹配任何单字符
 *        *	        匹配0或者任意数量的字符
 *        **	    匹配0或者更多的目录
 */
//@Configuration
//@EnableWebSecurity 基于springboot 可以不用
public class WebSecurityAntConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin();  //表单登录

        //授权
        http.authorizeRequests()
            //例子：
                //      URL路径	                            说明
                //      /app/*.x	                匹配(Matches)所有在app路径下的.x文件
                //      /app/p?ttern	                匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern
                //      /**/example                匹配(Matches)/app/example,/app/foo/example,和/example
                //      */app/**/dir/file.*   匹配(Matches)/app/dir/file.jsp,/app/foo/dir/file.html,/app/foo/bar/dir/file.pdf,和/app/dir/file.java
                //      /**/*.jsp           匹配(Matches)任何的.jsp 文件
                // ant 表达式
//                .antMatchers("/admin/demo").permitAll() // 不用认证
                .antMatchers("/**/*.js").permitAll()  // 不用认证   只要是.js 文件都放行
                .antMatchers("/**/*.png").permitAll() // 不用认证   只要是.png 文件都放行
                .antMatchers("/js/**", "/css/**", "/image/**").permitAll() //放行 js和css、image 目录下所有的文件
                .antMatchers(HttpMethod.POST, "/admin/demo").permitAll()
                .anyRequest().authenticated();  //  必须认证

        http.exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler()); // 支持自定义权限受限处理，需要实现 AccessDeniedHandler接口

         http.csrf().disable();//csrf关掉

    }

    @Bean
    public PasswordEncoder passwordEncoder(){
//        return NoOpPasswordEncoder.getInstance();
        return new BCryptPasswordEncoder();
    }


}
